import {
  BrowserView,
  BrowserWindow,
  app,
  globalShortcut,
  ipcMain,
  nativeTheme,
  Notification,
} from 'electron';
import localConfig from './initLocalConfig';
import winPosition from './getWinPosition';
import screenCapture from '@/core/screen-capture';

const registerHotKey = (mainWindow: BrowserWindow): void => {
  // 设置开机启动
  const setAutoLogin = async () => {
    const config = await localConfig.getConfig();
    // app.setLoginItemSettings 用于控制应用程序是否在用户登录时自动启动。
    // 这个功能在创建某些需要在启动时运行的应用程序，如消息应用或背景进程，时非常有用。
    app.setLoginItemSettings({
      openAtLogin: config.perf.common.start,
      openAsHidden: true,
    });
  };

  // 设置暗黑模式
  const setDarkMode = async () => {
    const config = await localConfig.getConfig();
    const isDark = config.perf.common.darkMode;
    if (isDark) {
      nativeTheme.themeSource = 'dark';
      mainWindow.webContents.executeJavaScript(
        `document.body.classList.add("dark");window.rubick.theme="dark"`
      );
      mainWindow.getBrowserViews().forEach((view: BrowserView) => {
        view.webContents.executeJavaScript(
          `document.body.classList.add("dark");window.rubick.theme="dark"`
        );
      });
    } else {
      nativeTheme.themeSource = 'light';
      mainWindow.webContents.executeJavaScript(
        `document.body.classList.remove("dark");window.rubick.theme="light"`
      );
      mainWindow.getBrowserViews().forEach((view: BrowserView) => {
        view.webContents.executeJavaScript(
          `document.body.classList.remove("dark");window.rubick.theme="light"`
        );
      });
    }
  };

  /**
   * 初始化方法
   */
  const init = async () => {
    // await setAutoLogin();
    await setDarkMode();
    const config = await localConfig.getConfig();
    // 注销所有的热键
    globalShortcut.unregisterAll();
    // 注册显示隐藏的快捷键
    globalShortcut.register(config.perf.shortCut.showAndHidden, () => {
      // 如果当前是显示状态，而且获取了焦点，那么就隐藏
      const currentShow = mainWindow.isVisible() && mainWindow.isFocused();
      if (currentShow) return mainWindow.hide();
      // 获取显示的xy的坐标
      const { x: wx, y: wy } = winPosition.getPosition();
      // 设置窗口不在全屏时始终置顶
      mainWindow.setAlwaysOnTop(false);
      // 设置窗口在所有工作区可见，并在全屏时可见
      mainWindow.setVisibleOnAllWorkspaces(true, { visibleOnFullScreen: true });
      // 使窗口获得焦点
      mainWindow.focus();
      // 设置窗口在所有工作区不可见
      mainWindow.setVisibleOnAllWorkspaces(false, {
        visibleOnFullScreen: true,
      });
      // 设置窗口位置
      mainWindow.setPosition(wx, wy);
      // 显示窗口
      mainWindow.show();
    });

    // 注册一下截图的快捷键
    globalShortcut.register(config.perf.shortCut.capture, () => {
      screenCapture(mainWindow, (data) => {
        data &&
          new Notification({
            title: '截图完成',
            body: '截图已存储到系统剪贴板中',
          }).show();
      });
    });

    // 注册自定义全局快捷键
    config.global.forEach((sc) => {
      if (!sc.key || !sc.value) return;
      globalShortcut.register(sc.key, () => {
        mainWindow.webContents.send('global-short-key', sc.value);
      });
    });
  };
  init();
  ipcMain.on('re-register', () => {
    init();
  });
};

export default registerHotKey;
